package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import java.util.ArrayList;

/**
 * @author Tanja
 */
public class KitchenView 
{
    private KitchenCTR controller;
    
    public KitchenView()
    {
        this.controller = new KitchenCTR();
        
        ArrayList<String> options = new ArrayList<String>();
		options.add("Tilføj køkken");
		options.add("Find køkken");
		options.add("Hent køkken");
		options.add("Redigér køkken");
		options.add("Slet køkken");
		
		boolean isTimeToQuit = false;
		while(!isTimeToQuit)
		{
			Console.printMenu(true, "Køkkener", options);
			int choice = Console.readChoice(0, 4);
			switch(choice)
			{
				case 1: addKitchen();		break;
				case 2: findKitchen();		break;
				case 3: getKitchen();		break;
				case 4: editKitchen();		break;
				case 5: removeKitchen();	break;
				case 0: isTimeToQuit = true;
			}
		}
    }

    private void addKitchen() 
    {
		ItemCTR stock = new ItemCTR();

        Console.print("Indtast navn:");
        String name = Console.readString();

        Console.print("Indtast et ID på en bordplade:");
		Item tableTop = null;
        boolean hasValidTableTop = false;
		while(!hasValidTableTop)
		{
			int tableTopInt = Console.readInt();
			tableTop = stock.getItem(tableTopInt);
			if(tableTop != null)
			{
				hasValidTableTop = true;
			}
			else
			{
				Console.print("Der findes ingen bordplade med det valgte ID. Prøv igen.");
			}
		}

        Console.print("Indtast ID på de ønskede skabe (0 for at aflutte):");
		ArrayList<Item> cupboards = new ArrayList<Item>();
		boolean wantToAddMore = true;
        while(wantToAddMore)
		{
			int cupboardInt = Console.readInt();
			if(cupboardInt != 0)
			{
				Item cupboard = stock.getItem(cupboardInt);
				cupboards.add(cupboard);
			}
			else
			{
				wantToAddMore = false;
			}
		}

        Console.print("Indtast ID på de ønskede skuffer (0 for at aflutte):");
        ArrayList<Item> drawers = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int drawerInt = Console.readInt();
            if(drawerInt != 0)
            {
                Item drawer = stock.getItem(drawerInt);
                drawers.add(drawer);
            }
            else
            {
                wantToAddMore = false;
            }
        }

        Console.print("Indtast ID på de ønskede hvidevarer (0 for at aflutte):");
        ArrayList<Item> appliances = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int applianceInt = Console.readInt();
            if(applianceInt != 0)
            {
                Item appliance = stock.getItem(applianceInt);
                appliances.add(appliance);
            }
            else
            {
                wantToAddMore = false;
            }
        }

		//TODO: Pricefix
        this.controller.addItem(name, 0d, tableTop, cupboards, drawers, appliances);
    }

    private void findKitchen(boolean standAlone)
    {
        ItemCTR stock = new ItemCTR();

        Console.print("For at søge efter et køkken, skal du indtaste mindst et af søgekriterierne.");
		Console.print("Indtast navn:");
        String name = Console.readString(true);

        Console.print("Indtast et ID på en bordplade:");
		Item tableTop = null;
        boolean hasValidTableTop = false;
		while(!hasValidTableTop)
		{
			int tableTopInt = Console.readInt(true);
			tableTop = stock.getItem(tableTopInt);
			if(tableTop != null || tableTopInt == 99)
			{
				hasValidTableTop = true;
			}
			else
			{
				Console.print("Der findes ingen bordplade med det valgte ID. Prøv igen.");
			}
		}

        Console.print("Indtast ID på de ønskede skabe:");
		ArrayList<Item> cupboards = new ArrayList<Item>();
		boolean wantToAddMore = true;
        while(wantToAddMore)
		{
			int cupboardInt = Console.readInt(true);
			if(cupboardInt == 99)
			{
				cupboardInt = 0;
			}
			if(cupboardInt != 0)
			{
				Item cupboard = stock.getItem(cupboardInt);
				cupboards.add(cupboard);
			}
			else
			{
				wantToAddMore = false;
			}
		}

        Console.print("Indtast ID på de ønskede skuffer:");
        ArrayList<Item> drawers = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int drawerInt = Console.readInt(true);
            if(drawerInt == 99)
			{
				drawerInt = 0;
			}
			if(drawerInt != 0)
            {
                Item drawer = stock.getItem(drawerInt);
                drawers.add(drawer);
            }
            else
            {
                wantToAddMore = false;
            }
        }

        Console.print("Indtast ID på de ønskede hvidevarer:");
        ArrayList<Item> appliances = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int applianceInt = Console.readInt(true);
			if(applianceInt == 99)
			{
				applianceInt = 0;
			}
            if(applianceInt != 0)
            {
                Item appliance = stock.getItem(applianceInt);
                appliances.add(appliance);
            }
            else
            {
                wantToAddMore = false;
            }
        }

		//TODO: Pricefix
		ArrayList<Kitchen> kitchens = this.controller.findKitchen(name, 0d, tableTop, cupboards, drawers, appliances, null);
        if(kitchens.size() > 0)
		{
			this.showList(kitchens);
			if(standAlone)
			{
				Console.print("Indtast det ønskede køkkens ID, som står ude til venstre i listen.");
				int id = Console.readInt();
				Kitchen kitchen = this.controller.getKitchen(id);
				if(kitchen != null)
				{
					this.showInfo(kitchen);
				}
				else
				{
					Console.print("Der kunne ikke findes nogen køkkener med det valgte ID.");
				}
			}
		}
		else
		{
			Console.print("Der fandtes ingen køkkener med de indtastede søgekriterier.");
		}
    }

	private void findKitchen()
	{
		this.findKitchen(true);
	}

	private void getKitchen()
	{
		Console.print("Indtast køkkenets ID.");
		int kitchenInt = Console.readInt();
		Kitchen kitchen = this.controller.getKitchen(kitchenInt);
		if(kitchen != null)
		{
			showInfo(kitchen);
		}
		else
		{
			Console.print("Der kunne ikke findes noget køkken med det valgte ID.");
		}
	}

    private void editKitchen()
    {
        Console.print("For at redigere et køkken, skal det først findes.");
        Kitchen kitchen = null;
        boolean hasValidKitchen = false;
        while(!hasValidKitchen)
        {
            try
			{
				kitchen = searchProcedure();
				if(kitchen != null)
				{
					hasValidKitchen = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
        }
        Console.print("Du får nu muligheden for at redigere de enkelte felter seperat. Hvis et felt ikke ønskes ændret, springes feltet over med ENTER. Den nuværende værdi i feltet vises i parantes i linien ovenover.");

		Console.print("Indtast navn på køkkenet ("+kitchen.getName()+"):");
        String name = Console.readString();
        if(!name.equals("")) { kitchen.setName(name); }

        Console.print("Indtast bordplade ("+kitchen.getTableTop().getName()+")");
        Item tableTop = null;
        boolean hasValidTableTop = false;
        ItemCTR stock = new ItemCTR();
		while(!hasValidTableTop)
		{
			int tableTopInt = Console.readInt(true);
			tableTop = stock.getItem(tableTopInt);
			if(tableTop != null || tableTopInt == 0)
			{
				hasValidTableTop = true;
			}
			else
			{
				Console.print("Der findes ingen bordplade med det valgte ID. Prøv igen.");
			}
		}
        kitchen.setTableTop(tableTop);
        
        Console.print("Indtast ID på de ønskede skabe:");
		ArrayList<Item> cupboards = new ArrayList<Item>();
		boolean wantToAddMore = true;
        while(wantToAddMore)
		{
			int cupboardInt = Console.readInt(true);
			if(cupboardInt != 0)
			{
				Item cupboard = stock.getItem(cupboardInt);
				cupboards.add(cupboard);
			}
			else
			{
				wantToAddMore = false;
			}
		}
        if(cupboards.size() != 0)
        {
            kitchen.setCupboards(cupboards);
        }

        Console.print("Indtast ID på de ønskede skuffer:");
        ArrayList<Item> drawers = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int drawerInt = Console.readInt(true);
            if(drawerInt != 0)
            {
                Item drawer = stock.getItem(drawerInt);
                drawers.add(drawer);
            }
            else
            {
                wantToAddMore = false;
            }
        }
        if(drawers.size() != 0)
        {
            kitchen.setDrawers(drawers);
        }

        Console.print("Indtast ID på de ønskede hvidevarer:");
        ArrayList<Item> appliances = new ArrayList<Item>();
        wantToAddMore = true;
        while(wantToAddMore)
        {
            int applianceInt = Console.readInt(true);
            if(applianceInt != 0)
            {
                Item appliance = stock.getItem(applianceInt);
                appliances.add(appliance);
            }
            else
            {
                wantToAddMore = false;
            }
        }
        if(appliances.size() != 0)
        {
            kitchen.setAppliances(appliances);
        }
        
    }

    private void removeKitchen()
    {
        Console.print("For at slette et køkken, skal det først findes.");
        Kitchen kitchen = null;
        boolean hasValidKitchen = false;
        while(!hasValidKitchen)
        {
        	try
			{
				kitchen = searchProcedure();
				if(kitchen != null)
				{
					hasValidKitchen = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
      }
      this.controller.removeKitchen(kitchen);
      Console.print(kitchen.getName()+" er nu slettet fra køkkendatabasen.");
    }

    private Kitchen searchProcedure() throws Exception
	{
		Console.print("Hvordan vil du finde køkkenet?");
		ArrayList<String> options = new ArrayList<String>();
		options.add("ID");
		options.add("Søgning");
		options.add("Liste");
		Console.printMenu(false, null, options);

		int choice = Console.readChoice(0, 3);
		int id = 0;
		boolean doSomething = true;
		switch(choice)
		{
			case 1:
				Console.print("Indtast køkkenets ID.");
				id = Console.readInt();
				break;
			case 2:
				Console.print("Indtast det ønskede køkkens ID, som står ude til venstre i listen af søgeresultater.");
				this.findKitchen();
				id = Console.readInt();
				break;
			case 3:
				Console.print("Indtast den ønskede varens ID, som står ude til venstre i listen.");
				this.showList(this.controller.getAllKitchens());
				id = Console.readInt();
				break;
			case 0:
				doSomething = false;
				break;

		}
		if(doSomething)
		{
			Kitchen kitchen = this.controller.getKitchen(id);
			if(kitchen != null)
			{
				return kitchen;
			}
			else
			{
				Console.print("Der kunne ikke findes noget køkken med det valgte ID.");
				throw new Exception();
			}
		}
		else
		{
			return null;
		}
	}

    private int showList(ArrayList<Kitchen> kitchens)
    {
        int i = 0;
        for(Kitchen kitchen : kitchens)
        {
            i++;
            Console.print("{"+kitchen.getId()+"} "+kitchen.getName());
        }
        return i;
    }


    private void showInfo(Kitchen kitchen)
    {
       Console.print("-Køkkener-");
        Console.print("Navn: "+kitchen.getName()+"\tID:"+kitchen.getId());
        Console.print("Bordplade: "+kitchen.getTableTop().getName());
        Console.print("Skabe:");
		Console.printList(kitchen.getCupboards());
		Console.print("Skuffer:");
		Console.printList(kitchen.getDrawers());
        Console.print("Hvidevarer:");
		Console.printList(kitchen.getAppliances());
    }
}
